package org.jsola.contract.service;

import org.jsola.contract.dao.IContractGroupDAO;
import org.jsola.contract.dto.ContractGroupAddDTO;
import org.jsola.contract.dto.ContractGroupUpdateDTO;
import org.jsola.contract.entity.ContractGroupDO;
import org.jsola.contract.query.ContractGroupQuery;
import org.jsola.contract.vo.ContractGroupListVO;
import org.jsola.contract.vo.ContractGroupVO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 合同类型分组
 *
 * @author JanusMix
 */
public interface IContractGroupService extends IService<IContractGroupDAO, ContractGroupDO> {

    /**
     * 新增合同类型分组
     *
     * @param contractGroupAddDTO 新增合同类型分组DTO
     * @param tokenUser           当前用户
     * @return 合同类型分组详情信息
     */
    ContractGroupVO save(ContractGroupAddDTO contractGroupAddDTO, TokenUser tokenUser);

    /**
     * 修改合同类型分组
     *
     * @param contractGroupUpdateDTO 修改合同类型分组DTO
     * @param tokenUser              当前用户
     * @return 更新数量
     */
    int update(ContractGroupUpdateDTO contractGroupUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除合同类型分组，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser        当前用户
     * @param contractGroupIds 合同类型分组id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, Long... contractGroupIds);

    /**
     * 根据合同类型分组id查找
     *
     * @param contractGroupId 合同类型分组id
     * @param siteId          所属站点id
     * @return 合同类型分组详情信息
     */
    ContractGroupVO selectById(Long contractGroupId, String siteId);

    /**
     * 查询合同类型分组
     *
     * @param contractGroupQuery 查询条件
     * @param tokenUser          所属站点id
     * @return 合同类型分组列表信息
     */
    List<ContractGroupListVO> select(ContractGroupQuery contractGroupQuery, TokenUser tokenUser);

    /**
     * 查询公司下合同类型分组 没有就创建
     *
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     */
    void createDefaultContractGroup(String companyId, TokenUser tokenUser);

    /**
     * 查询合同类型分组记录数
     *
     * @param contractGroupQuery 查询条件
     * @param siteId             所属站点id
     * @return 合同类型分组记录数
     */
    int selectCount(ContractGroupQuery contractGroupQuery, String siteId);

    /**
     * 分页查询合同类型分组
     *
     * @param contractGroupQuery 查询条件
     * @param siteId             所属站点id
     * @return 合同类型分组列表信息
     */
    Page<ContractGroupListVO> selectPage(ContractGroupQuery contractGroupQuery, String siteId);


    /**
     * 根据合同类型分组id查找
     *
     * @param contractGroupId 合同类型分组id
     * @param siteId          所属站点id
     * @return 合同类型分组
     */
    ContractGroupDO selectDOById(Long contractGroupId, String siteId);

    /**
     * 查询合同类型分组
     *
     * @param contractGroupQuery 查询条件
     * @param siteId             所属站点id
     * @return 合同类型分组列表
     */
    List<ContractGroupDO> selectDO(ContractGroupQuery contractGroupQuery, String siteId);


    /**
     * 查询公司下的合同类型分组
     *
     * @param subjectId 公司Id
     * @param tokenUser 当前用户
     * @return 公司下的合同类型分组
     */
    List<ContractGroupDO> selectBySubjectId(String subjectId, TokenUser tokenUser);

    /**
     * 查询租户下系统默认分组
     *
     * @param siteId 所属站点id
     * @return 系统默认分组
     */
    List<ContractGroupDO> selectIsSystem(String siteId);


    /**
     * 查询所有系统默认分组
     *
     * @return 系统默认分组
     */
    List<ContractGroupDO> selectIsSystemNotSiteId();

    /**
     * 查询用工单位下自定名称的合同类型分组
     *
     * @param subjectId 用工单位Id
     * @param names       当前用户
     * @return 公司下的合同类型分组
     */
    List<ContractGroupDO> selectBySubjectIdAndNames(String subjectId, List<String> names);
}


